using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection.Emit;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.DataAccessLayer.SqlServerProvider
{
    /// <summary>
    /// Clase Generica de acceso a datos para las clases enumeradas
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DALSqlServerEnumerador<T> : IDALEnumerador<T> where T : ObjetoABM, new()
    {        
        private static string nombre = typeof(T).Name;
        public DALSqlServerEnumerador()
        {
            
        }

        #region Miembros de IDALEnumerador<T>

        /// <summary>
        /// Devuelve una lista con los elementos del tipo T
        /// </summary>
        /// <returns></returns>
        public List<T> BuscarTodos()
        {
            DALSqlServerConnection sqlConn = null;
            SqlCommand sqlComm = null;
            SqlDataAdapter sqlDataAdapter;
            DataTable table = null;

            try
            {
                sqlConn = new DALSqlServerConnection();
                sqlComm = new SqlCommand();
                table = new DataTable();

                string sql = "SELECT " + nombre + "_id, " + nombre +
                            " FROM " + DALTableReference.GetTableName(nombre);

                sqlComm.Connection = sqlConn.Conexion;
                sqlComm.CommandType = CommandType.Text;
                sqlComm.CommandText = sql;
                sqlDataAdapter = new SqlDataAdapter(sqlComm);
                sqlDataAdapter.Fill(table);
                return CargarLista(table);
            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
            finally
            {
                if (sqlComm != null && sqlComm.Connection != null && sqlComm.Connection.State == ConnectionState.Open)
                {
                    sqlComm.Connection.Close();
                    sqlComm.Dispose();
                }
            }
        }

        
        private List<T> CargarLista(DataTable dataTable)
        {
            List<T> lstEnumeracion = new List<T>();
            foreach (DataRow dRow in dataTable.Rows)
            {
                T item = new T();
                item.Id = Convert.ToInt64(dRow[nombre+"_id"]);
                item.Nombre = dRow[nombre].ToString();
                lstEnumeracion.Add(item);
            }
            return lstEnumeracion;
        }
        #endregion
    }
}
